package ycl.common.utils;

import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson2.JSONObject;
import org.springframework.beans.BeanUtils;

import java.util.*;

public class JSONObjectConvertUtil {

	/**
	 * 映射实体字段, 映射一个新类, 保证两个类里面的字段和类型一致
	 *
	 * @param e   源
	 * @param t   新对象
	 * @param <T> 任意类
	 * @return 目的类
	 */
	public static <T> T convert(Object e, Class<T> t) {
		if (e instanceof String) {
			return convertString((String) e, t);
		}
		return convertString(JSONObject.toJSONString(e), t);
	}

	/**
	 * 将 e 的数据转移到 t 里, t 在 e 里不存在的数据保持不变
	 *
	 * @param e   e
	 * @param t   t
	 * @param <E> 泛型
	 * @param <T> 泛型
	 */
	public static <E, T> void convert(E e, T t) {
		convert(e, t, (String) null);
	}

	public static <E, T> void convert(E e, T t, String... ignored) {
		BeanUtils.copyProperties(e, t, ignored);
	}

	public static <T> T convertString(String s, Class<T> t) {
		return JSONObject.parseObject(s, t);
	}

	/**
	 * 集合映射到对应的实体集合
	 *
	 * @param c   源集合
	 * @param t   新对象类
	 * @param <E> 集合
	 * @param <T> 类
	 * @return 类的对象的集合
	 */
	public static <E, T> List<T> convertList(Collection<E> c, Class<T> t) {
		if (CollUtil.isEmpty(c))
			return new ArrayList<>();
		List<T> list = new ArrayList<>();
		c.forEach(v -> list.add(convert(v, t)));
		return list;
	}


	/**
	 * 实体参数映射成 Map
	 *
	 * @param t   实体
	 * @param <T> 任意类型
	 * @return Map
	 */
	@SuppressWarnings("unchecked")
	public static <T> Map<String, Object> convertMap(T t) {
		if (t instanceof String || t instanceof Boolean
				|| t instanceof Byte || t instanceof Character
				|| t instanceof Short || t instanceof Integer
				|| t instanceof Float || t instanceof Double
				|| t instanceof Long)
			return new HashMap<>();
		return (Map<String, Object>) JSONObject.parseObject(JSONObject.toJSONString(t), Map.class);
	}

}

